console.log('macro task 1: begin');

const path = require('path');
const fs = require('fs');

let add = function(a,b){
    console.log( `macro task 2: 求${a}加${b}之和`);
    return a + b ;
}

// 由setTimeout注册的回调操作属于异步任务(宏任务)
setTimeout( add, 0, 2, 3 );

const endTime = Date.now() + 10000;

let showTime = () => {
    let datetime = new Date();
    console.log( 'macro task 3: ', datetime.toISOString() );
    if( datetime > endTime ) {
        clearInterval(timer); // 清除timer对应的定时器
    }
};
// 由setInterval注册的回调操作属于异步任务(宏任务)
const timer = setInterval( showTime, 1000 );
console.log( timer );

let showNames = (...names) => {
    console.log( `macro task 4: 输出姓名`);
    names.forEach( name => console.log(name) );
}
const immediate = setImmediate( showNames, '李某芳', '王某然', '杨某俊', '罗某丹', '秦某娜', '菲尔娜' );
console.log( immediate );

const pathname = path.resolve(__dirname,'readme.txt');
const handler = (error, content) => {
    console.log( `macro task 5: 读取文件`);
    if( error ){
        console.log(error);
        return;
    }
    console.log( content );
}
// 当前任务调用 readFile 函数本身属于同步操作
// 但是由readFile所注册的回调操作属于异步操作(宏任务)
fs.readFile( pathname, 'utf8', handler);

console.log('macro task 1: end');

// 可以产生宏任务的操作:
// 1、用setTimeout注册的回调操作(即用setTimout创建的延迟任务(延迟执行一次))
// 2、用setInterval注册的回调操作(即用setInterval创建的定时任务(周期性执行))
// 3、用setImmediate注册的回调操作(即用setImmediate创建的延迟任务(延迟执行一次))
// 4、I/O操作
// 5、UI交互事件 (浏览器)
// 6、每个script元素中全局代码都对应一个宏任务 (浏览器)
